package com.bookstore.back.util;

import javax.servlet.http.HttpServletRequest;

/**
 * 请求工具类
 * 
 * @author 程序猿_Ti
 * @since 2025-07-22
 */
public class RequestUtil {

    // 开发环境标识，生产环境应设置为false
    private static final boolean IS_DEV_ENVIRONMENT = true;

    /**
     * 获取客户端真实IP地址
     */
    public static String getClientIpAddress(HttpServletRequest request) {
        // 优先级顺序的请求头
        String[] headers = {
            "X-Forwarded-For",
            "X-Real-IP",
            "Proxy-Client-IP",
            "WL-Proxy-Client-IP",
            "HTTP_CLIENT_IP",
            "HTTP_X_FORWARDED_FOR"
        };

        String ip = null;

        // 遍历所有可能的请求头
        for (String header : headers) {
            ip = request.getHeader(header);
            if (isValidIp(ip)) {
                // 如果是X-Forwarded-For，可能包含多个IP，取第一个
                if ("X-Forwarded-For".equals(header) && ip.contains(",")) {
                    ip = ip.split(",")[0].trim();
                }
                break;
            }
        }

        // 如果所有代理头都没有有效IP，使用远程地址
        if (!isValidIp(ip)) {
            ip = request.getRemoteAddr();
        }

        // 处理IPv6本地回环地址和开发环境IP模拟
        if ("0:0:0:0:0:0:0:1".equals(ip) || "::1".equals(ip) || "127.0.0.1".equals(ip)) {
            if (IS_DEV_ENVIRONMENT) {
                // 在开发环境中，模拟一个真实的IP地址
                ip = getSimulatedClientIp(request);
            } else {
                // 生产环境中保持原始IP
                ip = "127.0.0.1";
            }
        }

        return ip;
    }

    /**
     * 验证IP地址是否有效
     */
    private static boolean isValidIp(String ip) {
        return ip != null &&
               !ip.isEmpty() &&
               !"unknown".equalsIgnoreCase(ip) &&
               !"null".equalsIgnoreCase(ip);
    }

    /**
     * 在开发环境中模拟客户端IP
     * 可以根据不同的请求特征返回不同的模拟IP
     */
    private static String getSimulatedClientIp(HttpServletRequest request) {
        // 可以根据User-Agent、请求路径等信息模拟不同的IP
        String userAgent = request.getHeader("User-Agent");

        // 根据浏览器类型模拟不同的IP段
        if (userAgent != null) {
            if (userAgent.contains("Chrome")) {
                return "192.168.1.100"; // 模拟Chrome用户的IP
            } else if (userAgent.contains("Firefox")) {
                return "192.168.1.101"; // 模拟Firefox用户的IP
            } else if (userAgent.contains("Safari")) {
                return "192.168.1.102"; // 模拟Safari用户的IP
            } else if (userAgent.contains("Edge")) {
                return "192.168.1.103"; // 模拟Edge用户的IP
            }
        }

        // 默认模拟IP
        return "192.168.1.88";
    }

    /**
     * 获取用户代理信息
     */
    public static String getUserAgent(HttpServletRequest request) {
        return request.getHeader("User-Agent");
    }
}
